function test_reduction(data, dimensionality, includeSlowMethods)
  methods = {'PCA' 'ProbPCA' 'MDS' 'KernelPCA' 'GDA' 'DiffusionMaps'};
  
  brokenMethods = { \
    'SimplePCA' 'LDA' 'FastMVU' 'AutoencoderEA' 'LLE' 'Laplacian' \
    'HessianLLE' 'LTSA' 'Conformal' 'MVU' 'LLTSA' 'LLC' 'ManifoldChart' \
    'CFA' 'NPE' 'LPP'};
  
  slowMethods = {'Isomap' 'LandmarkIsomap' 'AutoencoderRBM' 'SPE'};
  
  if exist('includeSlowMethods', 'var')
    disp('Including slow methods…')
    
    methods = [methods slowMethods];
  end
  
  totalTime = 0;
  
  results = {};
  
  disp('Reducing dimensionality…')
  
  for i = 1:numel(methods)
    method = methods{i};
    tic();
    
    disp('')
    disp('---')
    disp(['  ** ' method ' **'])
    fflush(stdout);
    
    error = test_one_reduction(data, method, dimensionality);
    
    time  = toc();
    
    totalTime += time;
    
    disp(['  Error: ' num2str(error)])
    disp(['  Time:  ' num2str(time) ' s'])
    disp('---')

    result.name  = method;
    result.error = error;
    result.time  = time;
    results      = [results result];
  end

  disp('')

  fastestMethod.name  = 'None';
  fastestMethod.error = Inf;
  fastestMethod.time  = Inf;

  bestMethod.name     = 'None';
  bestMethod.error    = Inf;
  bestMethod.time     = Inf;

  for i = 1:numel(results)
    result = results(i);

    if (result.error < bestMethod.error)
      bestMethod.name  = result.name;
      bestMethod.error = result.error;
      bestMethod.time  = result.time;
    end

    if (result.time < fastestMethod.time)
      fastestMethod.name  = result.name;
      fastestMethod.error = result.error;
      fastestMethod.time  = result.time;
    end
  end

  disp('---')
  disp(['** Best Method:    ' bestMethod.name])
  disp(['   Rel Error:      ' num2str(bestMethod.error)])
  disp(['   Time:           ' num2str(bestMethod.time) 's'])
  disp('---')

  disp('')

  disp('---')
  disp(['** Fastest Method: ' fastestMethod.name])
  disp(['   Rel Error:      ' num2str(fastestMethod.error)])
  disp(['   Time:           ' num2str(fastestMethod.time) 's'])
  disp('---')

  disp('')

  disp(['Total time: ' num2str(totalTime) 's'])
  disp('')

